﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace mc_tester
{
    public partial class ApplicationForm : Form
    {

        private bool _portStateSwitchButtonCheckedChangeEnabled = true;
        private Device _device;
        private Int32 _tableLayoutRowCount = 0;

        public ApplicationForm()
        {

            InitializeComponent();
            
            //eszköz létrehozása
            _device = new Device();
            
            //toolstrip beállítások
            toolStripCOMtext = Properties.Settings.Default.COMPORT;
            toolStripPortStatus.Image = Properties.Resources.COMCLOSE;


            //gomb állapot beállítások
            portStateSwitchButton.Text = "port zárva";
            portStateSwitchButton.BackColor = Color.PaleVioletRed;


            if (Properties.Settings.Default.PORTAUTOOPEN)
                portStateSwitchButton.Checked = true;

            //tábla feltöltése PortControlokkal, két oszlopban
            int column = 0;
            //végigmegyünk a portokon
            foreach (KeyValuePair<string, Port> pair in _device._ports)
            {
                //kell egy láthatatlan control a 12. sorba, hogy a táblázat jól töltődjön fel
                if (_tableLayoutRowCount > 12)
                {
                    Label l = new Label();
                    l.Text = "";
                    portokTableLayout.Controls.Add(l, column, _tableLayoutRowCount);
                    column = 1;
                    _tableLayoutRowCount = 0;
                }
                //hozzáadjuk a PortControlt
                portokTableLayout.Controls.Add(pair.Value.portControl, column, _tableLayoutRowCount);
                _tableLayoutRowCount++;
            }
        }

        //toolstrip COMtext beállítás, és a Serial Port beállítása
        public string toolStripCOMtext
        {
            set
            {
                toolStripPort.Text =  value;
                //ha a port nyitva volt, bezárjuk
                if (_device._comm.serialPort.IsOpen)
                    serialportclose();
                //megpróbáljuk a portot beállítani 
                try
                {
                    _device._comm.serialPort.PortName = value;
                }
                catch (Exception)
                {
                    Console.WriteLine("Port név még nincs elmentve az alkalmazáshoz!");
                }
            }
        }

        //program kilépés
        private void fomenuFileExitItem_Click(object sender, EventArgs e)
        {
            Close();
        }

        //settings dialog megjelenítése
        private void fomenuSettingsItem_Click(object sender, EventArgs e)
        {
            AppSettings sett = new AppSettings(this);
            sett.ShowDialog();
        }

        //a serial port megnyitása
        void serialportopen()
        {
            //állítani fogjuk a checked állapotot, ezért egy ideig a CheckedChanged felfüggesztve
            _portStateSwitchButtonCheckedChangeEnabled = false;
            //megpróbáljuk a portot megnyitni és a gombok állapotát hozzá igazítani
            try
            {
                _device._comm.serialPort.Open();
                toolStripPortStatus.Image = Properties.Resources.COMOPEN;
                portStateSwitchButton.Text = "port nyitva";
                portStateSwitchButton.BackColor = Color.GreenYellow;
                portStateSwitchButton.Checked = true;
                Console.WriteLine("{0} port nyitva.", Properties.Settings.Default.COMPORT);
            }
            catch (Exception)
            {
                Console.WriteLine("{0} portot nem lehetett megnyitni.", Properties.Settings.Default.COMPORT);
            }
            //CheckedChanged engedve
            _portStateSwitchButtonCheckedChangeEnabled = true;
        }

        void serialportclose(){
            //állítani fogjuk a checked állapotot, ezért egy ideig a CheckedChanged felfüggesztve
            _portStateSwitchButtonCheckedChangeEnabled = false;
            //megpróbáljuk a portot bezárni és a gombok állapotát hozzá igazítani
            try
            {
                _device._comm.serialPort.Close();
                toolStripPortStatus.Image = Properties.Resources.COMCLOSE;
                portStateSwitchButton.Text = "port zárva";
                portStateSwitchButton.BackColor = Color.PaleVioletRed;
                portStateSwitchButton.Checked = false;
                Console.WriteLine("{0} port zárva.", Properties.Settings.Default.COMPORT);
            }
            catch (Exception)
            {
                Console.WriteLine("{0} portot nem lehetett bezárni.", Properties.Settings.Default.COMPORT);
            }
            //CheckedChanged engedve
            _portStateSwitchButtonCheckedChangeEnabled = true;
        }

        private void portStateSwitchButton_CheckedChanged(object sender, EventArgs e)
        {
            //ha reagálhat a portStateSwitchButton, kell mert különben körkörös hivatkozás lenne
            if (_portStateSwitchButtonCheckedChangeEnabled)
                if ((portStateSwitchButton.Checked) )
                {
                    serialportopen();
                }
                else
                {
                    serialportclose();
                }
        }

        //ideiglenes gomb, az összes port HIGH
        private void button1_Click(object sender, EventArgs e)
        {
            foreach (KeyValuePair<string, Port> pair in _device._ports)
            {
                    pair.Value.sendMessage(Port.LEVELS.HIGH.ToString() + " " + pair.Value.name);
                    pair.Value.sendMessage(Port.COMMANDS.GET.ToString() + " " + pair.Value.name);
            }
        }

        //ideiglenes gomb, az összes port LOW
        private void button2_Click(object sender, EventArgs e)
        {
            foreach (KeyValuePair<string, Port> pair in _device._ports)
            {
                    pair.Value.sendMessage(Port.LEVELS.LOW.ToString() + " " + pair.Value.name);
                    pair.Value.sendMessage(Port.COMMANDS.GET.ToString() + " " + pair.Value.name);
            }
        }

        //About dialog megjelenítése
        private void fomenuAboutItem_Click(object sender, EventArgs e)
        {
            AboutBox dialog = new AboutBox();
            dialog.ShowDialog();
        }

    }



}


